package com.zkh.myframe.aspect;

/**
 * 切面公共父类。多个切面同时配置时，其执行顺序为：<br>
 * <p><b>切面1前置 -> 切面2前置 -> 切面n前置 -> 被代理方法 -> 切面n后置/异常 -> 切面2后置/异常 -> 切面1后置/异常</b></p>
 * 注：后置和异常方法只会执行其中之一
 * @author zkh
 *
 */
public abstract class AspectSuper {
	/**
	 * 前置操作，默认返回true
	 * @param args 方法参数
	 * @return true：继续执行后续操作（即被代理方法、切面后置/异常）<br />
	 * false：不再执行后续操作（即被代理方法、切面后置/异常），返回null，效果同return null<br />
	 * 其它：直接返回，不再执行后续（即被代理方法、切面后置/异常）
	 */
	public Object before(Object[] args) {
		return true;
	}
	
	/**
	 * 后置操作
	 * @param args 方法参数
	 * @param res 执行代理方法的返回值
	 * @return 该返回值将作为最终的值返回
	 */
	public Object after(Object[] args, Object res) {
		return res;
	}
	
	/**
	 * 如果执行代理方法发生异常，使用该方法进行捕获
	 * @param args 方法参数
	 * @param e 抛出的异常
	 * @param lastReturnValue 若发生异常，且存在多个切面，则该值为上一个切面本方法的返回值。若是第一个切面，则该值为null
	 * @return 该返回值将作为最终的值返回
	 */
	public Object catchException(Object[] args, Throwable e, Object lastReturnValue) {
		return lastReturnValue;
	}
}
